#include "los_v1.h"

LOS_T Los={0};

//type 	协议类型 标准/轻量
//cmd1	命令字1
//cmd2	命令字2
void los_start(u8 type,u8 cmd1,u8 cmd2)
{
	Los.p=Los.buf;
	Los.type=type;
	Los.cmd1=cmd1;
	Los.cmd2=cmd2;
	Los.data_len=1;	//数据区长度至少为1
	Los.data_num=0;	
	Los.len=7;		//不算校验
	
	*Los.p++=0xA0;
	*Los.p++=type;
	*Los.p++=cmd1;
	*Los.p++=cmd2;
	*Los.p++=0;			//data_len
	*Los.p++=1;
	*Los.p++=0;			//data_num
}

void los_add_u8(u8 type,u8 data1)
{
	Los.data_t[Los.data_num].type=type;
	Los.data_t[Los.data_num].len=1;
	Los.data_num++;
	Los.data_len+=3;
	Los.len+=3;
	
	*Los.p++=type;
	*Los.p++=1;
	*Los.p++=data1;
}
void los_add_u16(u8 type,u16 data1)
{
	Los.data_t[Los.data_num].type=type;
	Los.data_t[Los.data_num].len=2;
	Los.data_num++;
	Los.data_len+=4;
	Los.len+=4;
	
	*Los.p++=type;
	*Los.p++=2;
	*Los.p++=(data1>>8);
	*Los.p++=data1;
}

void los_add_data(u8 type,u8 len,u8 *data1)
{
	u8 i;
	Los.data_t[Los.data_num].type=type;
	Los.data_t[Los.data_num].len=len;
	Los.data_num++;
	Los.data_len+=2+len;
	Los.len+=2+len;
	
	*Los.p++=type;
	*Los.p++=len;
	
	for(i=len;i;i--){
		*Los.p++=*data1++;
	}
}

void los_stop(void)
{
	u8 sum=0;
	u16 i;
	Los.buf[4]=Los.data_len>>8;
	Los.buf[5]=Los.data_len;
	Los.buf[6]=Los.data_num;
	for(i=0;i<Los.len;i++){
		sum+=Los.buf[i];
	}
	sum=~sum;
	Los.buf[Los.len++]=sum;
}

//从数据堆中寻找所有正确数据帧
void los_check(u8 *buf,u16 len)
{
	u8 sum;
	u16 i=0,j,data_len,frame_len;
	while(i<len-7){							//最短一帧8字节
		if(buf[i]==0xA0&&buf[i+1]==0x01){
			data_len=buf[i+4];
			data_len<<=8;
			data_len|=buf[i+5];
			if(data_len+7+i<=len){			//控制区域6字节，校验1字节
				frame_len=data_len+7;
				sum=0;
				for(j=0;j<frame_len;j++){	//校验和
					sum+=buf[i+j];
				}
				if(sum==0xff){
					los_rxproc(buf+i,frame_len);
					i+=frame_len;
					continue;
				}
			}
		}
		i++;
	}
}

//获取到返回0
u8 los_get_data(u8 *buf,u8 type,u8 *data1)
{
	return 1;
}

void los_rxproc(u8 *buf,u16 len)
{
	u8 i,cmd1,cmd2,data_num,data_type,data_datalen;
	u8 *p;
	u16 value;
	s32 data_len;
	
	len=len;
	
	cmd1=buf[2];				//命令字1
	cmd2=buf[3];				//命令字2
	data_len=buf[4];			//数据区长度
	data_len<<=8;
	data_len|=buf[5];
	data_num=buf[6];			//数据包数量
	data_len-=1;
	p=&buf[7];
	if(cmd1==0x01){				//配置指令
		while(data_len>0){
			data_type=*p++;
			data_datalen=*p++;
			if(data_datalen==1){
				value=*p++;
			}
			else if(data_datalen==2){
				value=*p++;
				value<<=8;
				value|=*p++;
			}
			else{
				for(i=0;i<data_datalen;i++){
					p++;
				}
			}
			switch(data_type){
				case 0x01:{			
					
				}break;
				default:break;
			}
			data_len-=2+data_datalen;
		}
	}
	else if(cmd1==0x02){		//查询指令
		while(data_len>0){
			data_type=*p++;
			data_datalen=*p++;
			if(data_datalen==1){
				value=*p++;
			}
			else if(data_datalen==2){
				value=*p++;
				value<<=8;
				value|=*p++;
			}
			else{
				for(i=0;i<data_datalen;i++){
					p++;
				}
			}
			switch(data_type){
				case 0x01:{	
					
				}break;
				default:break;
			}
			data_len-=2+data_datalen;
		}
	}
	else if(cmd1==0x03){		//上报指令

	}
	
//	if(cmd2&LOS_CMD2_REQUEST){
//		los_start(0x01,cmd1,LOS_CMD2_ACK);
//		los_stop();
//		uart0_send(Los.buf,Los.len);
//	}
}



